home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / commands / expand.c < prev    next >
C/C++ Source or Header  |  1990-07-23  |  2KB  |  96 lines

  1. /*  expand - expand tabs to spaces    Author: Terrence W. Holm */
  2.  
  3. /*  Usage:  expand  [ -tab1,tab2,tab3,... ]  [ file ... ]  */
  4.  
  5. #include <stddef.h>
  6. #include <string.h>
  7. #include <stdio.h>
  8.  
  9. #define MAX_TABS 32
  10.  
  11. int column = 0;            /* Current column, retained between files  */
  12.  
  13. main(argc, argv)
  14. int argc;
  15. char *argv[];
  16. {
  17.   int tabs[MAX_TABS];
  18.   int tab_index = 0;        /* Default one tab   */
  19.   int i;
  20.   FILE *f;
  21.  
  22.   tabs[0] = 8;            /* Default tab stop  */
  23.  
  24.   if (argc > 1 && argv[1][0] == '-') {
  25.     char *p = argv[1];
  26.     int last_tab_stop = 0;
  27.  
  28.     for (tab_index = 0; tab_index < MAX_TABS; ++tab_index) {
  29.         if ((tabs[tab_index] = atoi(p + 1)) <= last_tab_stop) {
  30.             fprintf(stderr, "Bad tab stop spec\n");
  31.             exit(1);
  32.         }
  33.         last_tab_stop = tabs[tab_index];
  34.  
  35.         if ((p = strchr(p + 1, ',')) == NULL) break;
  36.     }
  37.  
  38.     --argc;
  39.     ++argv;
  40.   }
  41.   if (argc == 1)
  42.     Expand(stdin, tab_index, tabs);
  43.   else
  44.     for (i = 1; i < argc; ++i) {
  45.         if ((f = fopen(argv[i], "r")) == NULL) {
  46.             perror(argv[i]);
  47.             exit(1);
  48.         }
  49.         Expand(f, tab_index, tabs);
  50.         fclose(f);
  51.     }
  52.  
  53.   exit(0);
  54. }
  55.  
  56.  
  57. Expand(f, tab_index, tabs)
  58. FILE *f;
  59. int tab_index;
  60. int tabs[];
  61. {
  62.   int next;
  63.   int c;
  64.   int i;
  65.  
  66.   while ((c = getc(f)) != EOF) {
  67.     if (c == '\t') {
  68.         if (tab_index == 0)
  69.             next = (column / tabs[0] + 1) * tabs[0];
  70.         else {
  71.             for (i = 0; i <= tab_index && tabs[i] <= column; ++i);
  72.  
  73.             if (i > tab_index)
  74.                 next = column + 1;
  75.             else
  76.                 next = tabs[i];
  77.         }
  78.  
  79.         do {
  80.             ++column;
  81.             putchar(' ');
  82.         } while (column < next);
  83.  
  84.         continue;
  85.     }
  86.     if (c == '\b')
  87.         column = column > 0 ? column - 1 : 0;
  88.     else if (c == '\n' || c == '\r')
  89.         column = 0;
  90.     else
  91.         ++column;
  92.  
  93.     putchar(c);
  94.   }
  95. }
  96.